#ifndef __APP_MESSAGE_H__
#define __APP_MESSAGE_H__

#include <unistd.h>

typedef enum
{
    TYPE_NONE,
    TYPE_BT,
    TYPE_LORA
} ConnectionType;

/**
 * 消息是由二进制组成，帧格式为：
 *  1.消息类型（1字节）
 *  2.消息ID的长度（2字节）
 *  3.消息内容的长度（1字节）
 *  4.消息ID，二进制（可变长度）
 *  5.消息内容，二进制（可变长度）
 */
typedef struct
{
    ConnectionType type;
    void *id;
    size_t id_len;
    void *data;
    size_t len;
}Message;

/**
 * @brief 将一个二进制串解析为消息
 * 
 * @param data 二进制串
 * @param len 二进制串长度
 * @return Message* 解析完成的消息指针
 */
Message *app_message_initFromBinary(void *data, size_t len);

/**
 * @brief 将一个json串解析为消息
 * 
 * @param json_str json串
 * @param len json串长度
 * @return Message* 解析完成的消息指针
 */
Message *app_message_initFromJson(char *json_str, size_t len);



/**
 * @brief 将一个消息转换为json字符串
 * 
 * @param msg 要转化的消息
 * @param json_str 输出的json字符串
 * @param len 输出的json字符串的缓冲区总长度
 * @return int 转换后的json字符串的长度  -1表示失败
 */
int app_message_saveAsJson(Message *msg, char *json_str, size_t len);

/**
 * @brief 将一个消息转换为二进制串
 * 
 * @param msg 要转化的消息
 * @param data 输出的二进制串指针
 * @param len 输出的二进制串的缓冲区总长度
 * @return int 转换后的二进制串的长度  -1表示失败
 */
int app_message_saveAsBinary(Message *msg, void *data, size_t len);

/**
 * @brief 释放一个消息的内存
 * 
 * @param msg 要释放的消息指针
 */
void app_message_free(Message *msg);


#endif /* __APP_MESSAGE_H__ */